/**

 * Definition for a binary tree node.

 * struct TreeNode {

 *     int val;

 *     TreeNode *left;

 *     TreeNode *right;

 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}

 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}

 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}

 * };

 */

class Solution {

public:

    vector<vector<int>> levelOrder(TreeNode* root) {

        queue<TreeNode*> q;

        int levelsize = 0;

        vector<vector<int>> vv;

        if (root) {

            q.push(root);

            levelsize = 1;

        }

        while (!q.empty()) {

            vector<int> v;

            while (levelsize--) {

                TreeNode* front = q.front();

                q.pop();

                if (front->left)

                    q.push(front->left);

                if (front->right)

                    q.push(front->right);

                v.push_back(front->val);

            }

            vv.push_back(v);

            levelsize = q.size();

        }

        return vv;

    }

};